//////////////////////////////////////////////////////////////////////////
//
// GAM203
// Singleton State Manager
// StateManager.h
// 
// Grant Johnson
// Qantm College
// 27/10/2010
//
//////////////////////////////////////////////////////////////////////////

#ifndef STATEMANAGER_H
#define STATEMANAGER_H

#include <vector>
#include "ABAppState.h"

class StateManager
{
public:
	StateManager();
	~StateManager();

	//////////////////////////////////////////////////////////////////////////
	//Update the state at the back of the vector
	//////////////////////////////////////////////////////////////////////////
	void Update(float a_dt);


	//////////////////////////////////////////////////////////////////////////
	//Render the state at the back of the vector
	//////////////////////////////////////////////////////////////////////////
	void Render(float a_dt);


	//////////////////////////////////////////////////////////////////////////
	//Push a new state onto the back of the vector
	//
	//Clears the renderer and calls OnEnter on the new state
	//////////////////////////////////////////////////////////////////////////
	void PushState(ABAppState *pState);

	//////////////////////////////////////////////////////////////////////////
	//Pop off the current state on the back of the vector
	//
	//This will run onPause and onExit functions of the state on the back
	//of the vector to clean up the state. It then pops it off the state and
	//runs onResume on the new state at the back of the vector.
	//////////////////////////////////////////////////////////////////////////
	void PopState();

	//////////////////////////////////////////////////////////////////////////
	//Change the state at the back of the vector to the one passed in
	//
	//This is similar to the PushState function, however, ChangeState will
	//run onExit and pop off the state on the back of the vector, clean up the
	//renderer and then push a new state onto the back, running its onEnter function.
	//////////////////////////////////////////////////////////////////////////
	void ChangeState(ABAppState *pState);

	//////////////////////////////////////////////////////////////////////////
	//Return the current state
	//
	//This will return the state at the back of the states vector.
	//////////////////////////////////////////////////////////////////////////
	ABAppState* GetCurrentState();

private:
	//////////////////////////////////////////////////////////////////////////
	//Member Data
	//
	//Stores any states being used by the program.
	//////////////////////////////////////////////////////////////////////////
	std::vector<ABAppState*> m_states; 
};

#endif //STATEMANAGER_H